﻿//typedef struct Node {
//    int val;
//    struct Node* next;
//}Node;
//typedef struct Queue {
//    Node* front;
//    Node* tail;
//}Queue;
//void QueuePush(Queue* Q, int x) {
//    Node* node = (Node*)malloc(sizeof(Node));
//    node->val = x;
//    node->next = 0;
//    if (!Q->front) {
//        Q->front = Q->tail = node;
//    }
//    //当用链式结构结点擦汗如时一定要考虑从左到右连接还是从右到左连接，因为连接不同，可以方便访问的结点也会不同
//    else {
//        Q->tail->next = node;
//        Q->tail = node;
//    }
//}
//void QueuePop(Queue* Q) {
//    if (!Q->front) {
//        return;
//    }
//    Node* next = Q->front->next;
//    free(Q->front);
//    Q->front = next;
//}
//void InitQueue(Queue** Q) {
//    (*Q) = (Queue*)malloc(sizeof(Queue));
//    (*Q)->front = (*Q)->tail = 0;
//}
//bool QueueEmpty(Queue* Q) {
//    return !Q->front;
//}
//void QueueDestory(Queue* Q) {
//    while (Q->front) {
//        QueuePop(Q);
//    }
//    free(Q);
//}
//typedef struct {
//    Queue* Q1;
//    Queue* Q2;
//} MyStack;
//
//MyStack* myStackCreate() {
//    MyStack* Stack = (MyStack*)malloc(sizeof(MyStack));
//    InitQueue(&Stack->Q1);
//    InitQueue(&Stack->Q2);
//    return Stack;
//}
//
//void Print(Queue* Q) {
//    Node* node = Q->front;
//    while (node) {
//        fprintf(stdout, "%d ", node->val);
//        node = node->next;
//    }
//    puts("");
//}
//
//void myStackPush(MyStack* obj, int x) {
//    if (QueueEmpty(obj->Q1)) {
//        QueuePush(obj->Q2, x);
//    }
//    else {
//        QueuePush(obj->Q1, x);
//    }
//    //Print(obj->Q1);
//    //Print(obj->Q2);
//}
//
//int myStackPop(MyStack* obj) {
//    if (QueueEmpty(obj->Q1)) {
//        while (obj->Q2->front->next) {
//            QueuePush(obj->Q1, obj->Q2->front->val);
//            QueuePop(obj->Q2);
//        }
//        int x = obj->Q2->front->val;
//        QueuePop(obj->Q2);
//        return x;
//    }
//    else {
//        while (obj->Q1->front->next) {
//            QueuePush(obj->Q2, obj->Q1->front->val);
//            QueuePop(obj->Q1);
//        }
//        int x = obj->Q1->front->val;
//        QueuePop(obj->Q1);
//        return x;
//    }
//}
//
//int myStackTop(MyStack* obj) {
//    if (QueueEmpty(obj->Q1)) {
//        return obj->Q2->tail->val;
//    }
//    else {
//        return obj->Q1->tail->val;
//    }
//}
//
//bool myStackEmpty(MyStack* obj) {
//    return QueueEmpty(obj->Q1) && QueueEmpty(obj->Q2);
//}
//
//void myStackFree(MyStack* obj) {
//    QueueDestory(obj->Q1);
//    QueueDestory(obj->Q2);
//    free(obj);
//}